/*
-- Autor: Ariel Pacay
-- Legajo N° 121237-0
-- Curso K2081
-- Docente a cargo: Valeria Pennella
-- Campus - Noche
-- TP1 Dioses Griegos

mortal(Mortal).            	  
adora(Mortal, Dios).
diosBueno(Nombre, MortalFavorito, NivelDivinidad).
diosMalo(Nombre, DiosesOdiados, NivelDivinidad).
hijoDivino(DiosPadre, DiosHijo).
hizo(Mortal, Accion).
don(Dios, regalo(Accion,Regalo)).   
don(Dios, castigo(Accion,Castigo)).
*/
diosMalo(urano,[apolo],60).
diosMalo(kronos,[zeus,urano,afrodita],90).
diosMalo(hades,[kronos,apolo],400).
diosBueno(zeus,hercules,500).
diosBueno(afrodita,eneas,50).
diosBueno(apolo,creso,80).
hijoDivino(afrodita,apolo).
hijoDivino(zeus,afrodita).
hijoDivino(kronos,zeus).
hijoDivino(kronos,urano).
mortal(hercules).
mortal(eneas).
mortal(teseo).
mortal(creso).
mortal(aquiles).
adora(hercules,zeus).
adora(eneas,zeus).
adora(eneas,hades).
adora(teseo,apolo).
adora(teseo,afrodita).
adora(aquiles,urano).
adora(aquiles,kronos).
don(zeus,regalo(hacerOfrenda,placer)).
don(zeus,regalo(pensar,vino)).
don(zeus,castigo(maldecir,rayo)).
don(afrodita,regalo(enamorarse,vino)).
don(afrodita,regalo(pensar,oro)).
don(urano,castigo(ignorar,sequia)).
don(apolo,regalo(pensar,vino)).
don(apolo,regalo(construir,salud)).
accion(eneas,pensar).
accion(hercules,maldecir).
accion(teseo,maldecir).
accion(aquiles,ignorar).
accion(eneas,ignorar).
accion(hercules,construir).
castigo(odiado,culpa).

monoteista(Mortal):- adora(Mortal, UnDios), forall(adora(Mortal, Dios),Dios=UnDios).
ateo(Mortal):- mortal(Mortal), not(adora(Mortal, _)).
indeciso(Mortal):- mortal(Mortal), diosBueno(Bueno,_,_), diosMalo(Malo,_,_),adora(Mortal, Bueno), adora(Mortal,Malo).

diosLoco(Bueno):-diosBueno(Bueno,_,_),don(Bueno,castigo(_,_)).
diosLoco(Malo):-diosMalo(Malo,_,_),don(Malo,regalo(_,_)).

regaloDivino(Dios,Mortal,Regalo):-accion(Mortal,Accion),don(Dios,regalo(Accion,Regalo)).
regaloDivino(Dios,Mortal,Regalo):-diosBueno(Dios,Mortal,_),don(Dios,regalo(_,Regalo)).

castigoDivino(Dios,Mortal,Castigo):-don(_, castigo(_,Castigo)), adora(_,Dios), mortal(Mortal), not(adora(Mortal,Dios)),accion(Mortal,Accion), don(Dios,castigo(Accion,Castigo)).
castigoDivino(Dios,Mortal,Castigo):-castigo(_,Castigo),adora(_,Dios),mortal(Mortal),diosMalo(Dios,Odiados,_), forall(adora(Mortal,OtroDios), member(OtroDios,Odiados)), castigo(odiado,Castigo).

mimado(Dios, Mortal):-diosBueno(Dios, Mortal, _).
mimado(Dios, Mortal):-hijoDivino(DiosPadre, Dios), mimado(DiosPadre, Mortal).

tiendeALoMaligno(Mortal):-mereceMuchosCastigos(Mortal).
tiendeALoMaligno(Mortal):-adoraAMaloDeLvlAlto(Mortal).
tiendeALoMaligno(Mortal):-adoraADosOMasMalos(Mortal).

mereceMuchosCastigos(Mortal):-mortal(Mortal), findall(Castigo,castigoDivino(_,Mortal,Castigo),Castigos),length(Castigos,Cantidad),Cantidad > 3.

adoraAMaloDeLvlAlto(Mortal):-mortal(Mortal),adora(Mortal,Malo),
diosMalo(Malo,_,Nivel),Nivel>100.

adoraADosOMasMalos(Mortal):-mortal(Mortal),diosBueno(Bueno,_,_),not(monoteista(Mortal)),not(ateo(Mortal)),
not(adora(Mortal,Bueno)). 
/*No se porque teseo cae por adoraADosOMasMalos*/

puedeBendecir(UnMortal, OtroMortal):-mortal(UnMortal), mortal(OtroMortal),
findall(Nivel,(diosBueno(Bueno,_,Nivel), adora(UnMortal,Bueno)),NivelesBuenos),
findall(Nivel,(diosMalo(Malo,_,Nivel), adora(OtroMortal,Malo)),NivelesMalos),
sumlist(NivelesBuenos,LoBueno),sumlist(NivelesMalos, LoMalo), LoBueno > LoMalo.

esUnSanto(Mortal):-mortal(Mortal), 
forall((mortal(OtroMortal),Mortal\=OtroMortal),puedeBendecir(Mortal,OtroMortal)).

accionConveniente(Accion):-accion(_,Accion),
forall(diosBueno(Bueno,_,_),don(Bueno, regalo(Accion,_))),
forall(diosMalo(Malo,_,_),not(don(Malo, castigo(Accion,_)))).
accionMistica(Accion):-accion(_,Accion),findall(Dios, don(Dios,regalo(Accion,_)), DiosesQuePremian),length(DiosesQuePremian,3).
accionMistica(Accion):-accion(_,Accion),don(Dios,regalo(Accion,_)),diosBueno(Dios,_,Nivel),Nivel>=80.
accionMistica(Accion):-accion(_,Accion),don(Dios,regalo(Accion,_)),diosMalo(Dios,_,Nivel),Nivel>=80.

diosQuisquilloso(Dios):-diosMalo(Dios,Odiados,_),
	elementosImpares(Odiados, Impares),
	todosRegalanVino(Impares).

todosRegalanVino(Lista):-forall(member(Dios, Lista),
		don(Dios,regalo(_,vino))).

/*todosRegalanVino([Dios]):-don(Dios,regalo(_,vino)).
todosRegalanVino([Dios|Cola]):-todosRegalanVino([Dios]),todosRegalanVino([Cola]).*/
elementosImpares(Listado, Impares):-findall(Impar,
	(nth1(Posicion,Listado,Impar), 1 is (Posicion mod 2) ),
	Impares).

entranEnMonteOlimpico(Dioses,Subdioses):-estaIncluidaEn(Subdioses, Dioses), hayDosBuenosEn(Subdioses),hayDosMalosEn(Subdioses),length(Subdioses,4).
estaIncluidaEn(Subdioses, Dioses):-forall(member(Dios, Subdioses),member(Dios, Dioses)).
hayDosBuenosEn(Lista):-diosBueno(Bueno1,_,_),diosBueno(Bueno2,_,_),Bueno1\=Bueno2,
member(Bueno1,Lista),member(Bueno2,Lista).
hayDosMalosEn(Lista):-diosMalo(Malo1,_,_),diosMalo(Malo2,_,_),Malo1\=Malo2,
member(Malo1,Lista),member(Malo2,Lista).
